'''
Created on 2011-12-29

@author: ajwang
'''
import sgmllib
from Queue import Queue
from threading import Condition, Thread
from urlparse import urlparse
import socket
socket.setdefaulttimeout(5.0)
from collections import deque
import time
import datetime

from const import CONST


Seeds = deque(['http://biolab.suda.edu.cn', 'http://bjwx.suda.edu.cn', 'http://bkssw.suda.edu.cn', 'http://bsh.suda.edu.cn', 'http://bwc.suda.edu.cn', 'http://call.suda.edu.cn', 'http://card.suda.edu.cn', 'http://cete.suda.edu.cn', 'http://chemistry.suda.edu.cn', 'http://chemlab.suda.edu.cn', 'http://ciptlab.suda.edu.cn', 'http://cjy.suda.edu.cn', 'http://clgc.suda.edu.cn', 'http://csxy.suda.edu.cn', 'http://cwc.suda.edu.cn', 'http://cxzy.suda.edu.cn', 'http://dag.suda.edu.cn', 'http://dangxiao.suda.edu.cn', 'http://db.suda.edu.cn', 'http://dfzfyj.suda.edu.cn', 'http://dgdz.suda.edu.cn', 'http://dj.suda.edu.cn', 'http://dsj.suda.edu.cn', 'http://dwshy.suda.edu.cn', 'http://dwyst.suda.edu.cn', 'http://dwzx.suda.edu.cn', 'http://dzxx.suda.edu.cn', 'http://emlab.suda.edu.cn', 'http://energy.suda.edu.cn', 'http://eng.suda.edu.cn', 'http://eng1.suda.edu.cn', 'http://file.suda.edu.cn', 'http://fineng.suda.edu.cn', 'http://focus.suda.edu.cn', 'http://forensic.suda.edu.cn', 'http://funsom.suda.edu.cn', 'http://fxcs.suda.edu.cn', 'http://fygwxy.suda.edu.cn', 'http://fzb.suda.edu.cn', 'http://garden.suda.edu.cn', 'http://ggw.suda.edu.cn', 'http://gh.suda.edu.cn', 'http://gwxy.suda.edu.cn', 'http://hlxy.suda.edu.cn', 'http://hpc.suda.edu.cn', 'http://hqglc.suda.edu.cn', 'http://hysgl.suda.edu.cn', 'http://ibms.suda.edu.cn', 'http://ihanyu.suda.edu.cn', 'http://international.suda.edu.cn', 'http://jdxy.suda.edu.cn', 'http://jfjt.suda.edu.cn', 'http://jgstpf.suda.edu.cn', 'http://jjs.suda.edu.cn', 'http://jnp.suda.edu.cn', 'http://jns.suda.edu.cn', 'http://jsyb.suda.edu.cn', 'http://jtxy.suda.edu.cn', 'http://jwc.suda.edu.cn', 'http://jxsys.suda.edu.cn', 'http://jyb.suda.edu.cn', 'http://jysw.suda.edu.cn', 'http://jyxy.suda.edu.cn', 'http://kczx.suda.edu.cn', 'http://kjlt.suda.edu.cn', 'http://law.suda.edu.cn', 'http://lcjn.suda.edu.cn', 'http://library.suda.edu.cn', 'http://library1.suda.edu.cn', 'http://libts.suda.edu.cn', 'http://lmscosu.suda.edu.cn', 'http://ltc.suda.edu.cn', 'http://ltx.suda.edu.cn', 'http://mail.suda.edu.cn', 'http://math.suda.edu.cn', 'http://mec.suda.edu.cn', 'http://medical.suda.edu.cn', 'http://mpa.suda.edu.cn', 'http://msetc.suda.edu.cn', 'http://museum.suda.edu.cn', 'http://my.suda.edu.cn', 'http://myauth.suda.edu.cn', 'http://nano.suda.edu.cn', 'http://nanoexp.suda.edu.cn', 'http://neser.suda.edu.cn', 'http://net.suda.edu.cn', 'http://net2.suda.edu.cn', 'http://neuroscience.suda.edu.cn', 'http://nlp.suda.edu.cn', 'http://oversea.suda.edu.cn', 'http://pac.suda.edu.cn', 'http://pccsu.suda.edu.cn', 'http://phyedu.suda.edu.cn', 'http://phylab.suda.edu.cn', 'http://physics.suda.edu.cn', 'http://rsc.suda.edu.cn', 'http://rss.iboker.com', 'http://rurc.suda.edu.cn', 'http://sbc.suda.edu.cn', 'http://sbcgxt.suda.edu.cn', 'http://scit.suda.edu.cn', 'http://scm.suda.edu.cn', 'http://scst.suda.edu.cn', 'http://sdbn.suda.edu.cn', 'http://sdekxy.suda.edu.cn', 'http://sdgcxl.suda.edu.cn', 'http://sdkjy.suda.edu.cn', 'http://sdttc.suda.edu.cn', 'http://sdtw.suda.edu.cn', 'http://sdtx.suda.edu.cn', 'http://sdty.suda.edu.cn', 'http://sdxyy.suda.edu.cn', 'http://search.suda.edu.cn', 'http://sfl.suda.edu.cn', 'http://shxy.suda.edu.cn', 'http://sit.suda.edu.cn', 'http://skc.suda.edu.cn', 'http://slsj.suda.edu.cn', 'http://snfz.suda.edu.cn', 'http://stpf.suda.edu.cn', 'http://sudabao.suda.edu.cn', 'http://sxy.suda.edu.cn', 'http://sysbio.suda.edu.cn', 'http://szdwwy.suda.edu.cn', 'http://tangcenter.suda.edu.cn', 'http://tdh.suda.edu.cn', 'http://tec.suda.edu.cn', 'http://texlab.suda.edu.cn', 'http://textile.suda.edu.cn', 'http://tjxh.suda.edu.cn', 'http://toupiao1.suda.edu.cn', 'http://toupiao2.suda.edu.cn', 'http://tyxy.suda.edu.cn', 'http://tzb.suda.edu.cn', 'http://tzfw.suda.edu.cn', 'http://uninews.suda.edu.cn', 'http://vm1.suda.edu.cn', 'http://webmail.suda.edu.cn', 'http://wenzheng.suda.edu.cn', 'http://wg.suda.edu.cn', 'http://www.suda.edu.cn', 'http://www.zhhz.suda.edu.cn', 'http://www2.suda.edu.cn', 'http://wxy.suda.edu.cn', 'http://xb.suda.edu.cn', 'http://xcb.suda.edu.cn', 'http://xdgx.suda.edu.cn', 'http://xiaoqing.suda.edu.cn', 'http://xjgx.suda.edu.cn', 'http://xjj.suda.edu.cn', 'http://xjzx.suda.edu.cn', 'http://xk.suda.edu.cn', 'http://xk1.suda.edu.cn', 'http://xlcp.suda.edu.cn', 'http://xlzx.suda.edu.cn', 'http://xsc.suda.edu.cn', 'http://xsh.suda.edu.cn', 'http://xskx.suda.edu.cn', 'http://xsst.suda.edu.cn', 'http://xxzxcs.suda.edu.cn', 'http://yanhui.suda.edu.cn', 'http://yingping.suda.edu.cn', 'http://yjs.suda.edu.cn', 'http://yjsgl.suda.edu.cn', 'http://youth.suda.edu.cn', 'http://ysxy.suda.edu.cn', 'http://ysxysy.suda.edu.cn', 'http://yx.suda.edu.cn', 'http://yxbfzb.suda.edu.cn', 'http://yxbsyzx.suda.edu.cn', 'http://yxsyzx.suda.edu.cn', 'http://yxx.suda.edu.cn', 'http://zcjygs.suda.edu.cn', 'http://zhuanti.suda.edu.cn', 'http://zjc.suda.edu.cn', 'http://zkzs.suda.edu.cn', 'http://zsb.suda.edu.cn', 'http://zxbm.suda.edu.cn', 'http://zxbx.suda.edu.cn', 'http://zxyxpt.suda.edu.cn', 'http://zyz.suda.edu.cn', 'http://zzb.suda.edu.cn'])
Links = {}




class crawler(sgmllib.SGMLParser):
    def __init__(self, _url, verbose=0):
        sgmllib.SGMLParser.__init__(self, verbose)
        self.hyperlinks = []
        fp = urllib.urlopen(_url)
        self.base_url = fp.geturl()
        _html = fp.read()
        self.charset = self.get_page_charset(_html)
        soup = BeautifulSoup.BeautifulSoup(_html.decode(self.charset))
        self._parse(str(soup))
        
    def _parse(self, s):
        self.feed(s)
        self.close()
    
    def get_page_charset(self, _html):
        ptn = re.compile(r'<meta[^>]+charset=(.*)\"')
        m = ptn.search(_html)
        if m: return m.group(1)
        else:
            _cs = chardet.detect(_html)['encoding']
            if not _cs:
                return 'utf-8'
            return _cs
            
            

    def _get_valid_url(self, link):
    	print link
        try:
            fp = urllib.urlopen(link)
            if fp.headers['Content-Type'].lower().rfind('html') != -1:
                return fp.geturl()
            else: return None
        except:
            return None
        
    def url_encode(self, _url):
        ptn = re.compile(r'([^\x00-\x7f]+)')
        arr = ptn.split(_url)
        
        sss = ''
        for s in arr:
            if ptn.match(s):
                sss += urllib.quote(s.decode('utf-8').encode(self.charset))
            else: sss += s
        
        return sss

    def _add_link(self, value):
        value = urljoin(self.base_url, value)
        
        # remove fragment
        _u = urlparse(value)
        
        if _u.scheme.lower() != 'http':
            return
        
        if _u.fragment != '':
            value = value[:value.index('#')]
        
        # eliminate none possible links
        _path = urlparse(value).path
        
        if _path != '' and _path.rfind('.') != -1:
            _subfix = _path[_path.rfind('.') + 1:].lower()
            if _subfix not in ['htm', 'html', 'shtml', 'xhtml', 'asp', 'aspx', 'jsp', 'php', 'action']:
                return
            
        # only links to html page and under PageLinks.DOMAIN is added
#        value = self._get_valid_url(value)
#        if value and value.rfind(CONST.DOMAIN) != -1:
#            self.hyperlinks.append(value)
        if value.rfind(CONST.DOMAIN) != -1:
            self.hyperlinks.append(self.url_encode(value))
    
    #--------------------------------------------------------------
    # tags process
    def start_a(self, attributes):
        for name, value in attributes:
            if name == "href": self._add_link(value)

    def start_frame(self, attributes):
        for name, value in attributes:
            if name == "src": self._add_link(value)
    
    def start_iframe(self, attributes):
        for name, value in attributes:
            if name == "src": self._add_link(value)


    #---------------------------------------------------------------
    def get_html_links(self):
        return self.hyperlinks
    
    
